/* page.tsx spboucher.ai Web Author: Simon-Pierre Boucher Mail: contact@spboucher.ai */ import type { Metadata } from "next"; import Link from "next/link"; import { notFound } from "next/navigation"; import { ArrowLeft, Braces, CheckCircle2, Database, FileText, FlaskConical, Github, ScrollText, } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { buttonVariants } from "@/components/ui/button"; import { Reveal } from "@/components/reveal"; import { SectionHeading } from "@/components/section-heading"; import { getResearchPaper, allResearchPapers } from "@/lib/research"; import { researchDetails } from "@/lib/research-details"; interface PageProps { params: Promise<{ slug: string }>; } export function generateStaticParams() { return allResearchPapers .filter((p) => researchDetails.some((d) => d.slug === p.slug)) .map((p) => ({ slug: p.slug })); } export async function generateMetadata({ params, }: PageProps): Promise { const { slug } = await params; const paper = getResearchPaper(slug); const detail = researchDetails.find((d) => d.slug === slug); if (!paper || !detail) return {}; return { title: `${paper.title} — ${paper.num}`, description: detail.hero.subheadline, }; } export default async function ResearchDetailPage({ params }: PageProps) { const { slug } = await params; const paper = getResearchPaper(slug); const detail = researchDetails.find((d) => d.slug === slug); if (!paper || !detail) notFound(); return (
{/* Header */}

{paper.title}

{detail.hero.headline}

{detail.hero.subheadline}

Simon-Pierre Boucher —{" "} contact@spboucher.ai

{paper.repo && ( )} {paper.source && ( )}
{/* Headline findings */} {detail.findings.length > 0 && (
{detail.findings.map((f) => (

{f.value}

{f.label}

))}
)} {/* Abstract */}
{detail.abstract.map((paragraph) => (

{paragraph}

))}
{/* Contributions */} {detail.contributions.length > 0 && (
    {detail.contributions.map((c, i) => (
  1. {c.title}

    {c.description}

  2. ))}
)} {/* Data & methodology */}
{detail.data.length > 0 && (
{detail.data.map((d, i) => (

{d.title}

{d.description}

))}
)} {detail.methodology.length > 0 && (
{detail.methodology.map((m, i) => (

{m.title}

{m.description}

))}
)}
{/* Reproducibility */} {detail.reproducibility.length > 0 && (
    {detail.reproducibility.map((item, i) => (
  • ))}
)} {/* Keywords + CTA */}
); }